Add a --name option for setting the package name
authorChris Wong <lambda.fairy@gmail.com>
Tue, 21 Apr 2015 22:54:18 +0000 (10:54 +1200)
committerChris Wong <lambda.fairy@gmail.com>
Fri, 24 Apr 2015 04:56:06 +0000 (16:56 +1200)
src/bin/new.rs
src/cargo/ops/cargo_new.rs

index 0abff6a5747f4677a32d51cac57d4b93d6fbea07..fdfb0283e0c1ac149596cfbdfcd7a49806b459a7 100644 (file)
@@ -8,6 +8,7 @@ struct Options {
     flag_verbose: bool,
     flag_bin: bool,
     arg_path: String,
+    flag_name: Option<String>,
     flag_vcs: Option<ops::VersionControl>,
 }
 
@@ -24,6 +25,7 @@ Options:
                         control system (git or hg) or do not initialize any version
                         control at all (none) overriding a global configuration.
     --bin               Use a binary instead of a library template
+    --name <name>       Set the resulting package name
     -v, --verbose       Use verbose output
 ";
 
@@ -31,12 +33,13 @@ pub fn execute(options: Options, config: &Config) -> CliResult<Option<()>> {
     debug!("executing; cmd=cargo-new; args={:?}", env::args().collect::<Vec<_>>());
     config.shell().set_verbose(options.flag_verbose);
 
-    let Options { flag_bin, arg_path, flag_vcs, .. } = options;
+    let Options { flag_bin, arg_path, flag_name, flag_vcs, .. } = options;
 
     let opts = ops::NewOptions {
         version_control: flag_vcs,
-        path: &arg_path,
         bin: flag_bin,
+        path: &arg_path,
+        name: flag_name.as_ref().map(|s| s.as_ref()),
     };
 
     ops::new(opts, config).map(|_| None).map_err(|err| {
index 9544b52434ea0caf40d5d77060ead94b7261939f..d75c2b38062cca092413a9d320b027726c8a68f2 100644 (file)
@@ -18,6 +18,7 @@ pub struct NewOptions<'a> {
     pub version_control: Option<VersionControl>,
     pub bin: bool,
     pub path: &'a str,
+    pub name: Option<&'a str>,
 }
 
 impl Decodable for VersionControl {
@@ -46,16 +47,20 @@ pub fn new(opts: NewOptions, config: &Config) -> CargoResult<()> {
         return Err(human(format!("Destination `{}` already exists",
                                  path.display())))
     }
-    let name = try!(path.file_name().and_then(|s| s.to_str()).chain_error(|| {
-        human(&format!("cannot create a project with a non-unicode name: {:?}",
-                       path.file_name().unwrap()))
-    }));
-    let name =
-        if opts.bin {
-            name
-        } else {
-            strip_rust_affixes(name)
-        };
+    let name = match opts.name {
+        Some(name) => name,
+        None => {
+            let dir_name = try!(path.file_name().and_then(|s| s.to_str()).chain_error(|| {
+                human(&format!("cannot create a project with a non-unicode name: {:?}",
+                               path.file_name().unwrap()))
+            }));
+            if opts.bin {
+                dir_name
+            } else {
+                strip_rust_affixes(dir_name)
+            }
+        }
+    };
     for c in name.chars() {
         if c.is_alphanumeric() { continue }
         if c == '_' || c == '-' { continue }